/**
 * 数字输入框验证指令
 */
export default {
  bind(el, binding, vnode) {
    const ele = el.tagName === 'INPUT' ? el : el.querySelector('input')
    ele.handler = function() {
      // 获取相关的指令配置信息
      const rel = vnode.data.directives.filter(item => {
        return item.name === 'only-num'
      })[0]
      vnode.context.$nextTick(() => {
        handleInput(ele, vnode, rel)
      })
    }
    ele.addEventListener('input', ele.handler)
  },
  unbind(el) {
    const ele = el.tagName === 'INPUT' ? el : el.querySelector('input')
    ele.removeEventListener('input', ele.handler)
  }
}

function handleInput(ele, vnode, rel) {
  let val
  switch (true) {
    case rel.modifiers.float: // 浮点型
      val = ele.value.replace(/[^\d.]/g, '') // 清除“数字”和“.”以外的字符
      val = val.replace(/\.{2,}/g, '.') // 只保留第一个. 清除多余的
      val = val.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.')
      val = val.replace(/^(\-)*(\d+)\.(\d\d\d\d).*$/, '$1$2.$3')// 只能输入四个小数
      if (val.indexOf('.') < 0 && val !== '') { // 以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
        val = parseFloat(val)
      }
      break
    default: // 默认仅支持输入数字
      val = parseInt(ele.value)
      isNaN(val) && (val = '')
  }
  ele.value = val
  setValueWithExpressionVue({
    index: rel.value,
    currObj: vnode.context,
    expression: vnode.data.model.expression,
    value: val,
    key: vnode.key,
    arg: rel.arg,
    toString: rel.modifiers.string || rel.modifiers.float
  })
}

function setValueWithExpressionVue(option) {
  if (option.index) {
    const index = option.index.split('.')
    let arr = option.currObj
    for (let i = 0; i < index.length - 1; i++) {
      arr = arr[index[i]]
    }
    arr[index[index.length - 1]] = option.value
  } else {
    const expression = option.expression.split('.')
    expression.forEach(function(item, i) {
      if (i < expression.length - 1) {
        option.currObj = option.currObj[item]
      } else {
        if (option.key !== undefined) {
          option.currObj[item][option.key][option.arg] = (option.value === '' || option.toString) ? option.value : option.value * 1
        } else {
          option.currObj[item] = (option.value === '' || option.toString) ? option.value : option.value * 1
        }
      }
    })
  }

}
